package com.recipedb.sprint.util;

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Component
public class TokenUtil {

    private final StringRedisTemplate redisTemplate;
    // Token前缀（区分其他Redis键）
    private static final String TOKEN_PREFIX = "user:token:";
    // Token有效期：24小时（可调整）
    private static final long TOKEN_EXPIRE = 86400;

    public TokenUtil(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    /**
     * 生成Token（UUID），并存储到Redis（key=TOKEN_PREFIX+token，value=userId）
     */
    public String generateToken(Long userId) {
        String token = UUID.randomUUID().toString().replace("-", "");
        // 存储Token到Redis，设置过期时间
        redisTemplate.opsForValue().set(
                TOKEN_PREFIX + token,
                userId.toString(),
                TOKEN_EXPIRE,
                TimeUnit.SECONDS
        );
        return token;
    }

    /**
     * 从Token中获取UserId（校验Token有效性）
     */
    public Long getUserIdFromToken(String token) {
        String userIdStr = redisTemplate.opsForValue().get(TOKEN_PREFIX + token);
        if (userIdStr == null) {
            throw new RuntimeException("Token无效或已过期");
        }
        // 刷新Token过期时间（会话保持：每次访问延长24小时）
        redisTemplate.expire(TOKEN_PREFIX + token, TOKEN_EXPIRE, TimeUnit.SECONDS);
        return Long.parseLong(userIdStr);
    }

    /**
     * 登出：删除Redis中的Token
     */
    public void removeToken(String token) {
        redisTemplate.delete(TOKEN_PREFIX + token);
    }

    public boolean validateToken(String token) {
        return redisTemplate.hasKey(TOKEN_PREFIX + token);
    }
}